Problem gelöst. Folgende Schritte habe ich unternommen (alles auf Seite des Clients): Verhindert, dass mehr als eine Sendeoperation gleichzeitig laufen (gameserver.cpp). bool GameServerConnection::sendTcp(std::shared_ptr<PkgT> pkg) { assert(m_server == nullptr); // server does not send anything in this example { std::lock_guard<std::mutex> lock(m_sendMutex); if(m_currentlySending) return false; m_currentlySending = true; } m_debugTcpSendFile.write((const char*) pkg->data(), pkg->size()); boost::asio::async_write(m_tcpSocket, boost::asio::buffer(*pkg), boost::bind(&GameServerConnection::handleSentTcp, this, pkg, boost::asio::placeholders::error())); return true; } void GameServerConnection::handleSentTcp(std::shared_ptr<PkgT> pkg, const boost::system::error_code& error) { { // unlock sending std::lock_guard<std::mutex> lock(m_sendMutex); assert(m_currentlySending); m_currentlySending = false; } std::cout << "handleSentTcp() called\n"; // Das wird irgendwie nie aufgerufen. pkg.reset(); if(!handleError(error)) return; } Dafür gesorgt, dass ioservice->run() nicht vorzeitig terminiert. Dazu habe ich dem Client einfach gesagt, dass er direkt nach dem Herstellen der Verbindung beginnen soll, asynchron etwas zu empfangen (natürlich wird er nie etwas empfangen). Nun endlich empfängt der Server 1:1 das, was der Client sendet. Ich danke euch allen!